精通Linux系列二十八:标准输出、格式化输出
点击关注公众号,AI&编程干货及时送达
屏幕输出
命令 | 含义 |
echo | 在标准输出上打印简单文本。 |
printf | 在标准输出上打印格式化的文本。 |
yes | 在标准输出上打印重复的文本。 |
seq | 在标准输出上打印数字序列。 |
clear | 清除屏幕或窗口。 |
Linux提供了几个用于在标准输出上打印消息的命令,例如echo
:
→ echo hello world
hello world
每个命令都有不同的优点和预期用途。学习Linux、调试问题、编写shell脚本(参见[“用Shell脚本编程”])或仅仅是自言自语时,这些命令都是非常有价值的。
echo
stdin stdout - file -- opt --help --version
echo [options] strings
echo
命令简单地打印其参数:
→ echo 我们正在玩
我们正在玩
令人困惑的是,有几个不同的echo
命令,其行为略有不同。有一个*/bin/echo*,但Linux shell通常使用一个内置命令覆盖它,该命令称为echo
。要找出您正在使用哪个,请运行以下命令:
→ type echo
echo是一个shell内置命令
有用的选项
-n | 不打印最后的换行符。 |
-e | 识别并解释转义字符。例如,尝试echo 'hello\a' 和echo -e 'hello\a' 。前者直接打印,后者会发出哔哔声。 |
-E | 不解释转义字符:-e 的反义词。 |
可用的转义字符有:
\a | 警报(播放哔哔声) |
\b | 退格 |
\c | 不打印最后的换行符(与-n 效果相同) |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 横向制表符 |
\v | 纵向制表符 |
\\ | 一个反斜杠 |
\' | 单引号 |
\" | 双引号 |
\nnn | ASCII值为*nnn *的字符(八进制) |
printf
stdin stdout - file -- opt --help --version
printf format_string [arguments]
printf
命令是增强版的echo
:它在标准输出上打印格式化的字符串。它的操作方式与C编程语言的printf()
函数非常相似,该函数将格式字符串应用于一系列参数以创建某些指定的输出。例如:
→ printf "用户%s今年%d岁。\n" sandy 29
用户sandy今年29岁。
第一个参数是格式字符串,在我们的例子中包含两个格式说明符,%s
和%d
。后续的参数,sandy和29,被printf
替换到格式字符串中然后打印。格式说明符可以用于浮点数,变得很精细:
→ printf "那将是$%0.2f, 先生。\n" 3
那将是$3.00, 先生。
Linux中有两个printf
命令可用:一个内置在bash shell中,另一个在*/usr/bin/printf*中。两者之间的区别只在于一个格式说明符,%q
,仅由bash内置支持:它打印转义符号(“\
”),因此其输出可以安全地用作shell输入。注意区别:
→ printf "这是一个引号:%s\n" "\""
这是一个引号:"
→ printf "这是一个引号:%q\n" "\""
这是一个引号:\"
Note: The original content contained terms and references specific to UNIX and Linux, which are retained in the translated content.
确保格式说明符(%
)的数量等于提供给printf
的参数数量是你的责任。如果参数过多,多余的将被忽略;如果参数过少,printf
会假设默认值(数值格式为0,字符串格式为空字符串)。尽管如此,你应该把这种不匹配视为错误,即使printf
能够宽容处理。如果这些在你的shell脚本中隐藏,那么它们就是潜在的错误。格式说明符在C函数printf
的手册页(manpage)中有详细描述(参见man 3 printf
)。以下是一些常用的:
%d | 十进制整数 |
%ld | 长十进制整数 |
%o | 八进制整数 |
%x | 十六进制整数 |
%f | 浮点数 |
%lf | 双精度浮点数 |
%c | 单个字符 |
%s | 字符串 |
%q | 转义任何shell元字符的字符串 |
%% | 单独的百分号 |
在前导百分号后,你可以插入一个数字表达式来表示输出的最小宽度。例如,“%5d”意味着以五字符宽的字段打印十进制数,而“%6.2f”表示以六字符宽的字段打印浮点数,并在小数点后有两位数字。一些有用的数字表达式是:
n | 最小宽度*n *。 |
0 n | 最小宽度*n *,用前导零填充。 |
n.m | 最小宽度*n ,小数点后有m *位数字。 |
printf
还可以解释如“\n”(打印换行符)和“\a”(响铃)这样的转义字符。查看echo
命令以获取完整列表。
yes
stdin stdout - 文件 -- 选项 --help --version
yes [字符串]
yes
命令将给定的字符串(默认为“y”)无限次地打印,每行一个字符串:
虽然一开始它可能看起来没什么用,但yes
可以完美地将交互式命令转换为批处理命令。想要摆脱烦人的“你确定要这么做吗?”消息?将yes
的输出导入命令的输入以回答所有这些提示:
→ yes | 我的交互式命令
当*我的交互式命令
*终止时,yes
也会终止。
seq
stdin stdout - 文件 -- 选项 --help --version
seq [选项] 规格
seq
命令打印一系列整数或实数,适合传输给其他程序。有三种类型的规格参数:
• 一个数字:上限
seq
从1开始,数到这个数字:→ **
seq 3** 1 2 3
• 两个数字:下限和上限
seq
从第一个数字开始,尽可能数到第二个数字:→ **
seq 2 5** 2 3 4 5
• 三个数字:下限、增量和上限
seq
从第一个数字开始,按第二个数字增加,到达(或之前到达)第三个数字:→ **
seq 1 .3 2** 1 1.3 1.6 1.9
你还可以使用负增量倒退:→ **
seq 5 -1 2** 5 4 3 2
有用的选项
-w | 根据需要打印前导零,使所有行宽度相同:→ ** seq -w 8 10** 08 09 10 |
-f 格式 | 使用类似printf 的格式字符串格式化输出行,必须包括%g (默认)、%e 或%f :→ ** seq -f '*%g*' 3** **1** **2** **3** |
-s 字符串 | 使用给定的字符串作为数字之间的分隔符。默认情况下,会打印一个换行符(即,每行一个数字):→ ** seq -s ':' 10** 1:2:3:4:5:6:7:8:9:10 |
clear
stdin stdout - 文件 -- 选项 --帮助 --版本
clear
这个命令简单地清除了你的显示屏或者命令行窗口。
推荐阅读
你好,我是拾叁,7年开发老司机、互联网两年外企5年。怼得过阿三老美,也被PR comments搞崩溃过。这些年我打过工,创过业,接过私活,也混过upwork。赚过钱也亏过钱。一路过来,给我最深的感受就是不管学什么,一定要不断学习。只要你能坚持下来,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯和编程知识,帮你积累弯道超车的资本。